home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1997 April / macformat-049.iso / mac / Shareware Plus / Developers / dropg++ / usr / include / machine / cpu.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-02-20  |  10.1 KB  |  306 lines  |  [TEXT/R*ch]

  1. /*
  2.  * Copyright (c) 1988 University of Utah.
  3.  * Copyright (c) 1982, 1990, 1993
  4.  *    The Regents of the University of California.  All rights reserved.
  5.  *
  6.  * This code is derived from software contributed to Berkeley by
  7.  * the Systems Programming Group of the University of Utah Computer
  8.  * Science Department.
  9.  *
  10.  * Redistribution and use in source and binary forms, with or without
  11.  * modification, are permitted provided that the following conditions
  12.  * are met:
  13.  * 1. Redistributions of source code must retain the above copyright
  14.  *    notice, this list of conditions and the following disclaimer.
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in the
  17.  *    documentation and/or other materials provided with the distribution.
  18.  * 3. All advertising materials mentioning features or use of this software
  19.  *    must display the following acknowledgement:
  20.  *    This product includes software developed by the University of
  21.  *    California, Berkeley and its contributors.
  22.  * 4. Neither the name of the University nor the names of its contributors
  23.  *    may be used to endorse or promote products derived from this software
  24.  *    without specific prior written permission.
  25.  *
  26.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  27.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  29.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  30.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  32.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  33.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  34.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  35.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  36.  * SUCH DAMAGE.
  37.  *
  38.  * from: Utah $Hdr: cpu.h 1.16 91/03/25$
  39.  *
  40.  *    @(#)cpu.h    8.4 (Berkeley) 1/5/94
  41.  */
  42.  
  43. /*
  44.  * Exported definitions unique to hp300/68k cpu support.
  45.  */
  46.  
  47. /*
  48.  * definitions of cpu-dependent requirements
  49.  * referenced in generic code
  50.  */
  51. #define    COPY_SIGCODE        /* copy sigcode above user stack in exec */
  52.  
  53. #define    cpu_exec(p)            /* nothing */
  54. #define    cpu_swapin(p)            /* nothing */
  55. #define    cpu_wait(p)            /* nothing */
  56. #define cpu_setstack(p, ap)        (p)->p_md.md_regs[SP] = ap
  57. #define cpu_set_init_frame(p, fp)    (p)->p_md.md_regs = fp
  58.  
  59. /*
  60.  * Arguments to hardclock and gatherstats encapsulate the previous
  61.  * machine state in an opaque clockframe.  One the hp300, we use
  62.  * what the hardware pushes on an interrupt (frame format 0).
  63.  */
  64. struct clockframe {
  65.     u_short    sr;        /* sr at time of interrupt */
  66.     u_long    pc;        /* pc at time of interrupt */
  67.     u_short    vo;        /* vector offset (4-word frame) */
  68. };
  69.  
  70. #define    CLKF_USERMODE(framep)    (((framep)->sr & PSL_S) == 0)
  71. #define    CLKF_BASEPRI(framep)    (((framep)->sr & PSL_IPL) == 0)
  72. #define    CLKF_PC(framep)        ((framep)->pc)
  73. #if 0
  74. /* We would like to do it this way... */
  75. #define    CLKF_INTR(framep)    (((framep)->sr & PSL_M) == 0)
  76. #else
  77. /* but until we start using PSL_M, we have to do this instead */
  78. #define    CLKF_INTR(framep)    (0)    /* XXX */
  79. #endif
  80.  
  81.  
  82. /*
  83.  * Preempt the current process if in interrupt from user mode,
  84.  * or after the current trap/syscall if in system mode.
  85.  */
  86. #define    need_resched()    { want_resched++; aston(); }
  87.  
  88. /*
  89.  * Give a profiling tick to the current process when the user profiling
  90.  * buffer pages are invalid.  On the hp300, request an ast to send us
  91.  * through trap, marking the proc as needing a profiling tick.
  92.  */
  93. #define    need_proftick(p)    { (p)->p_flag |= P_OWEUPC; aston(); }
  94.  
  95. /*
  96.  * Notify the current process (p) that it has a signal pending,
  97.  * process as soon as possible.
  98.  */
  99. #define    signotify(p)    aston()
  100.  
  101. #define aston() (astpending++)
  102.  
  103. int    astpending;        /* need to trap before returning to user mode */
  104. int    want_resched;        /* resched() was called */
  105.  
  106.  
  107. /*
  108.  * simulated software interrupt register
  109.  */
  110. extern unsigned char ssir;
  111.  
  112. #define SIR_NET        0x1
  113. #define SIR_CLOCK    0x2
  114.  
  115. #define siroff(x)    ssir &= ~(x)
  116. #define setsoftnet()    ssir |= SIR_NET
  117. #define setsoftclock()    ssir |= SIR_CLOCK
  118.  
  119. /*
  120.  * CTL_MACHDEP definitions.
  121.  */
  122. #define    CPU_CONSDEV        1    /* dev_t: console terminal device */
  123. #define    CPU_MAXID        2    /* number of valid machdep ids */
  124.  
  125. #define CTL_MACHDEP_NAMES { \
  126.     { 0, 0 }, \
  127.     { "console_device", CTLTYPE_STRUCT }, \
  128. }
  129.  
  130. /*
  131.  * The rest of this should probably be moved to ../hp300/hp300cpu.h,
  132.  * although some of it could probably be put into generic 68k headers.
  133.  */
  134.  
  135. /* values for machineid */
  136. #define    HP_320        0    /* 16Mhz 68020+HP MMU+16K external cache */
  137. #define    HP_330        1    /* 16Mhz 68020+68851 MMU */
  138. #define    HP_350        2    /* 25Mhz 68020+HP MMU+32K external cache */
  139. #define    HP_360        3    /* 25Mhz 68030 */
  140. #define    HP_370        4    /* 33Mhz 68030+64K external cache */
  141. #define    HP_340        5    /* 16Mhz 68030 */
  142. #define    HP_375        6    /* 50Mhz 68030+32K external cache */
  143. #define    HP_380        7    /* 25Mhz 68040 */
  144. #define HP_433        8    /* 33Mhz 68040 */
  145.  
  146. /* values for mmutype (assigned for quick testing) */
  147. #define    MMU_68040    -2    /* 68040 on-chip MMU */
  148. #define    MMU_68030    -1    /* 68030 on-chip subset of 68851 */
  149. #define    MMU_HP        0    /* HP proprietary */
  150. #define    MMU_68851    1    /* Motorola 68851 */
  151.  
  152. /* values for ectype */
  153. #define    EC_PHYS        -1    /* external physical address cache */
  154. #define    EC_NONE        0    /* no external cache */
  155. #define    EC_VIRT        1    /* external virtual address cache */
  156.  
  157. /* values for cpuspeed (not really related to clock speed due to caches) */
  158. #define    MHZ_8        1
  159. #define    MHZ_16        2
  160. #define    MHZ_25        3
  161. #define    MHZ_33        4
  162. #define    MHZ_50        6
  163.  
  164. #ifdef KERNEL
  165. extern    int machineid, mmutype, ectype;
  166. extern    char *intiobase, *intiolimit;
  167.  
  168. /* what is this supposed to do? i.e. how is it different than startrtclock? */
  169. #define    enablertclock()
  170.  
  171. #endif
  172.  
  173. /* physical memory sections */
  174. #define    ROMBASE        (0x00000000)
  175. #define    INTIOBASE    (0x00400000)
  176. #define    INTIOTOP    (0x00600000)
  177. #define    EXTIOBASE    (0x00600000)
  178. #define    EXTIOTOP    (0x20000000)
  179. #define    MAXADDR        (0xFFFFF000)
  180.  
  181. /*
  182.  * Internal IO space:
  183.  *
  184.  * Ranges from 0x400000 to 0x600000 (IIOMAPSIZE).
  185.  *
  186.  * Internal IO space is mapped in the kernel from ``intiobase'' to
  187.  * ``intiolimit'' (defined in locore.s).  Since it is always mapped,
  188.  * conversion between physical and kernel virtual addresses is easy.
  189.  */
  190. #define    ISIIOVA(va) \
  191.     ((char *)(va) >= intiobase && (char *)(va) < intiolimit)
  192. #define    IIOV(pa)    ((int)(pa)-INTIOBASE+(int)intiobase)
  193. #define    IIOP(va)    ((int)(va)-(int)intiobase+INTIOBASE)
  194. #define    IIOPOFF(pa)    ((int)(pa)-INTIOBASE)
  195. #define    IIOMAPSIZE    btoc(INTIOTOP-INTIOBASE)    /* 2mb */
  196.  
  197. /*
  198.  * External IO space:
  199.  *
  200.  * DIO ranges from select codes 0-63 at physical addresses given by:
  201.  *    0x600000 + (sc - 32) * 0x10000
  202.  * DIO cards are addressed in the range 0-31 [0x600000-0x800000) for
  203.  * their control space and the remaining areas, [0x200000-0x400000) and
  204.  * [0x800000-0x1000000), are for additional space required by a card;
  205.  * e.g. a display framebuffer.
  206.  *
  207.  * DIO-II ranges from select codes 132-255 at physical addresses given by:
  208.  *    0x1000000 + (sc - 132) * 0x400000
  209.  * The address range of DIO-II space is thus [0x1000000-0x20000000).
  210.  *
  211.  * DIO/DIO-II space is too large to map in its entirety, instead devices
  212.  * are mapped into kernel virtual address space allocated from a range
  213.  * of EIOMAPSIZE pages (vmparam.h) starting at ``extiobase''.
  214.  */
  215. #define    DIOBASE        (0x600000)
  216. #define    DIOTOP        (0x1000000)
  217. #define    DIOCSIZE    (0x10000)
  218. #define    DIOIIBASE    (0x01000000)
  219. #define    DIOIITOP    (0x20000000)
  220. #define    DIOIICSIZE    (0x00400000)
  221.  
  222. /*
  223.  * HP MMU
  224.  */
  225. #define    MMUBASE        IIOPOFF(0x5F4000)
  226. #define    MMUSSTP        0x0
  227. #define    MMUUSTP        0x4
  228. #define    MMUTBINVAL    0x8
  229. #define    MMUSTAT        0xC
  230. #define    MMUCMD        MMUSTAT
  231.  
  232. #define    MMU_UMEN    0x0001    /* enable user mapping */
  233. #define    MMU_SMEN    0x0002    /* enable supervisor mapping */
  234. #define    MMU_CEN        0x0004    /* enable data cache */
  235. #define    MMU_BERR    0x0008    /* bus error */
  236. #define    MMU_IEN        0x0020    /* enable instruction cache */
  237. #define    MMU_FPE        0x0040    /* enable 68881 FP coprocessor */
  238. #define    MMU_WPF        0x2000    /* write protect fault */
  239. #define    MMU_PF        0x4000    /* page fault */
  240. #define    MMU_PTF        0x8000    /* page table fault */
  241.  
  242. #define    MMU_FAULT    (MMU_PTF|MMU_PF|MMU_WPF|MMU_BERR)
  243. #define    MMU_ENAB    (MMU_UMEN|MMU_SMEN|MMU_IEN|MMU_FPE)
  244.  
  245. /*
  246.  * 68851 and 68030 MMU
  247.  */
  248. #define    PMMU_LVLMASK    0x0007
  249. #define    PMMU_INV    0x0400
  250. #define    PMMU_WP        0x0800
  251. #define    PMMU_ALV    0x1000
  252. #define    PMMU_SO        0x2000
  253. #define    PMMU_LV        0x4000
  254. #define    PMMU_BE        0x8000
  255. #define    PMMU_FAULT    (PMMU_WP|PMMU_INV)
  256.  
  257. /*
  258.  * 68040 MMU
  259.  */
  260. #define    MMU4_RES    0x001
  261. #define    MMU4_TTR    0x002
  262. #define    MMU4_WP        0x004
  263. #define    MMU4_MOD    0x010
  264. #define    MMU4_CMMASK    0x060
  265. #define    MMU4_SUP    0x080
  266. #define    MMU4_U0        0x100
  267. #define    MMU4_U1        0x200
  268. #define    MMU4_GLB    0x400
  269. #define    MMU4_BE        0x800
  270.  
  271. /* 680X0 function codes */
  272. #define    FC_USERD    1    /* user data space */
  273. #define    FC_USERP    2    /* user program space */
  274. #define    FC_PURGE    3    /* HPMMU: clear TLB entries */
  275. #define    FC_SUPERD    5    /* supervisor data space */
  276. #define    FC_SUPERP    6    /* supervisor program space */
  277. #define    FC_CPU        7    /* CPU space */
  278.  
  279. /* fields in the 68020 cache control register */
  280. #define    IC_ENABLE    0x0001    /* enable instruction cache */
  281. #define    IC_FREEZE    0x0002    /* freeze instruction cache */
  282. #define    IC_CE        0x0004    /* clear instruction cache entry */
  283. #define    IC_CLR        0x0008    /* clear entire instruction cache */
  284.  
  285. /* additional fields in the 68030 cache control register */
  286. #define    IC_BE        0x0010    /* instruction burst enable */
  287. #define    DC_ENABLE    0x0100    /* data cache enable */
  288. #define    DC_FREEZE    0x0200    /* data cache freeze */
  289. #define    DC_CE        0x0400    /* clear data cache entry */
  290. #define    DC_CLR        0x0800    /* clear entire data cache */
  291. #define    DC_BE        0x1000    /* data burst enable */
  292. #define    DC_WA        0x2000    /* write allocate */
  293.  
  294. #define    CACHE_ON    (DC_WA|DC_BE|DC_CLR|DC_ENABLE|IC_BE|IC_CLR|IC_ENABLE)
  295. #define    CACHE_OFF    (DC_CLR|IC_CLR)
  296. #define    CACHE_CLR    (CACHE_ON)
  297. #define    IC_CLEAR    (DC_WA|DC_BE|DC_ENABLE|IC_BE|IC_CLR|IC_ENABLE)
  298. #define    DC_CLEAR    (DC_WA|DC_BE|DC_CLR|DC_ENABLE|IC_BE|IC_ENABLE)
  299.  
  300. /* 68040 cache control register */
  301. #define    IC4_ENABLE    0x8000        /* instruction cache enable bit */
  302. #define    DC4_ENABLE    0x80000000    /* data cache enable bit */
  303.  
  304. #define    CACHE4_ON    (IC4_ENABLE|DC4_ENABLE)
  305. #define    CACHE4_OFF    (0)
  306.